﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PDS_ANDU.DAO;
using PDS_ANDU.Entidades;
using PDS_ANDU.Controles;
using System.Text.RegularExpressions;

namespace PDS_ANDU.GUI
{
    public partial class PublicarNoticia : Form
    {
        ControlNotificacion control;

        private List<Deporte> deportes;
        private List<Deporte> deportesSeleccionados;
        private List<Equipo> equipos;
        private List<Equipo> equiposSeleccionados;
        private List<Deportista> deportistas;
        private List<Deportista> deportistasSeleccionados;
        private List<Torneo> torneos;
        private List<Torneo> torneosSeleccionados;

        public PublicarNoticia()
        {
            InitializeComponent();
            control = new ControlNotificacion();
            deportes = new List<Deporte>();
            deportesSeleccionados = new List<Deporte>();
            equipos = new List<Equipo>();
            equiposSeleccionados = new List<Equipo>();
            deportistas = new List<Deportista>();
            deportistasSeleccionados = new List<Deportista>();
            torneos = new List<Torneo>();
            torneosSeleccionados = new List<Torneo>();
        }

        public List<Deporte> getDeportes()
        {
            deportes = control.getDeportes();
            return deportes;
        }
        public List<Equipo> getEquipos()
        {
            equipos = control.getEquipos();
            return equipos;
        }
        public List<Deportista> getDeportistas()
        {
            deportistas = control.getDeportistas();
            return deportistas;
        }
        public List<Torneo> getTorneos()
        {
            torneos = control.getTorneos();
            return torneos;
        }

        /// <summary>
        /// Método que guarda la selección del deporte que ha sido efectuada en
        /// la interfaz del usuario (PublicarNoticia)
        /// </summary>
        /// <param name="nombreDeporte"></param>
        /// <returns></returns>
        internal bool guardarSeleccionDeporte(string nombreDeporte)
        {
            foreach (Deporte d in deportesSeleccionados)
                if (d.Nombre == nombreDeporte)
                    return false;
            foreach (Deporte d in deportes)
                if (d.Nombre == nombreDeporte)
                {
                    deportesSeleccionados.Add(d);
                    break;
                }
            return true;
        }

        internal bool guardarSeleccionTorneo(string nombreTorneo)
        {
            foreach (Torneo t in torneosSeleccionados)
                if (t.Nombre == nombreTorneo)
                    return false;
            foreach (Torneo t in torneos)
                if (t.Nombre == nombreTorneo)
                {
                    torneosSeleccionados.Add(t);
                    break;
                }
            return true;
        }

        internal bool guardarSeleccionEquipo(string nombreEquipo)
        {
            foreach (Equipo e in equiposSeleccionados)
                if (e.Nombre == nombreEquipo)
                    return false;
            foreach (Equipo e in equipos)
                if (e.Nombre == nombreEquipo)
                {
                    equiposSeleccionados.Add(e);
                    break;
                }
            return true;
        }

        internal bool guardarSeleccionDeportista(string nombreDeportista)
        {
            foreach (Deportista e in deportistasSeleccionados)
                if (e.Apellido + ", " + e.Nombre == nombreDeportista)
                    return false;
            foreach (Deportista e in deportistas)
                if (e.Apellido + ", " + e.Nombre == nombreDeportista)
                {
                    deportistasSeleccionados.Add(e);
                    break;
                }
            return true;
        }

        private void PublicarNoticia_Load(object sender, EventArgs e)
        {
            this.Location = new Point(this.MdiParent.ClientSize.Width / 2 - this.Width / 2, this.MdiParent.ClientSize.Height / 2 - this.Height / 2);

            foreach (Deporte deporte in this.getDeportes())
            {
                //comboBox1.Items.Add(deporte.Nombre);
                checkedListBox1.Items.Insert(0, deporte.Nombre);
            }
            foreach (Torneo torneo in this.getTorneos())
            {
                checkedListBox2.Items.Insert(0, torneo.Nombre);
               // comboBox2.Items.Add(torneo.Nombre);
            }
            foreach (Equipo equipo in this.getEquipos())
            {
                checkedListBox3.Items.Insert(0, equipo.Nombre);
                //comboBox3.Items.Add(equipo.Nombre);
            }
            foreach (Deportista deportista in this.getDeportistas())
            {
                checkedListBox4.Items.Insert(0, deportista.Apellido + ", " + deportista.Nombre);
                //comboBox4.Items.Add(deportista.Apellido + ", " + deportista.Nombre);
            }

        }

        /// <summary>
        /// Cuando se cierra publicar noticia se debe mostrar la ventana de editor
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PublicarNoticia_FormClosing(object sender, FormClosingEventArgs e)
        {
            Editor ventana = new Editor();
            ventana.MdiParent = this.MdiParent;
            ventana.Show();
        }

        private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            
            if (checkedListBox1.CheckedItems.Count > 0)
            {
                button5.Enabled = true;
            }
            else
                button5.Enabled = false;

        }

        /// <summary>
        /// Para categorizar la noticia, se deben validar todos los campos de entrada y,
        /// luego, enviar un mensaje al control para publicar la noticia
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                this.validarTitulo();
                this.validarEnlace();
                this.validarResumen();

                for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
                    this.guardarSeleccionDeporte(checkedListBox1.CheckedItems[i].ToString());

                for (int i = 0; i < checkedListBox2.CheckedItems.Count; i++)
                    this.guardarSeleccionTorneo(checkedListBox2.CheckedItems[i].ToString());

                for (int i = 0; i < checkedListBox3.CheckedItems.Count; i++)
                    this.guardarSeleccionEquipo(checkedListBox3.CheckedItems[i].ToString());

                for (int i = 0; i < checkedListBox4.CheckedItems.Count; i++)
                    this.guardarSeleccionDeportista(checkedListBox4.CheckedItems[i].ToString());

                if (control.publicarNoticia(textBox1.Text, textBox2.Text, dateTimePicker1.Value, textBox4.Text, deportesSeleccionados, torneosSeleccionados, equiposSeleccionados, deportistasSeleccionados))
                {
                    MessageBox.Show("Felicitaciones! La noticia ha sido categorizada con éxito.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void validarTitulo()
        {
            if (textBox1.Text.Length < 1 || textBox1.Text.Length > 79)
                throw new Exception("La longitud del título no es válida (1 a 79 caracteres)");
        }

        private void validarEnlace()
        {
            Regex oRegExp = new Regex(@"(http|https)://([\w-]+\.)+(/[\w- ./?%&=]*)?", RegexOptions.IgnoreCase);
            if (!oRegExp.Match(textBox2.Text).Success)
                throw new Exception("Formato de enlace no válido");
        }

        private void validarResumen()
        {
            if(textBox4.Text.Length<5)
                throw new Exception("El resumen es demasiado corto (mínimo 5 caracteres)");
        }
    }
}
